package top.zywork.common;

import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Random;

/**
 * IP工具类，获取客户端真实的IP地址<br />
 * 创建于2017-12-19<br />
 *
 * @author 王振宇
 * @version 1.0
 */
public class IPUtils {

    /**
     * 根据HttpServletRequest对象获取客户端真实的IP地址
     * @param request HttpServletRequest对象
     * @return
     */
    public static String getIP(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (invalidIp(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (invalidIp(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (invalidIp(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (invalidIp(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (invalidIp(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }

    private static boolean invalidIp(String ip) {
        return StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip);
    }

    /**
     * ip地址范围
     */
    public static final int[][] ipRange = {
            /**
             * 36.56.0.0-36.63.255.255
            */
            { 607649792, 608174079 },
            /**
             * 61.232.0.0-61.237.255.255
            */
            { 1038614528, 1039007743 },
            /**
             * 106.80.0.0-106.95.255.255
            */
            { 1783627776, 1784676351 },
            /**
             * 121.76.0.0-121.77.255.255
            */
            { 2035023872, 2035154943 },
            /**
             * 123.232.0.0-123.235.255.255
            */
            { 2078801920, 2079064063 },
            /**
             * 139.196.0.0-139.215.255.255
            */
            { -1950089216, -1948778497 },
            /**
             * 171.8.0.0-171.15.255.255
            */
            { -1425539072, -1425014785 },
            /**
             * 182.80.0.0-182.92.255.255
            */
            { -1236271104, -1235419137 },
            /**
             * 210.25.0.0-210.47.255.255
            */
            { -770113536, -768606209 },
            /**
             * 222.16.0.0-222.95.255.255
            */
            { -569376768, -564133889 },
    };

    /**
     * 获取随机ip地址
     * @return
     */
    public static String getRandomIp() {
        Random random = new Random();
        int index = random.nextInt(10);
        return numberToIp(ipRange[index][0] + random.nextInt(ipRange[index][1] - ipRange[index][0]));
    }

    /**
     * 整数转ip地址
     * @param ip
     * @return
     */
    public static String numberToIp(int ip) {
        int[] b = new int[4];
        b[0] = (ip >> 24) & 0xff;
        b[1] = (ip >> 16) & 0xff;
        b[2] = (ip >> 8) & 0xff;
        b[3] = ip & 0xff;
        return b[0] + "." + b[1] + "." + b[2] + "." + b[3];
    }
}
